package com.itheima.d6_dynamic_proxy_case;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理工具类
 *
 * @author spt
 */
public class ProxyUtils {

    //请返回一个 具备可以统计耗时时间的 代理对象
    public static UserService getProxy(UserService userService) {
        /*
            public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h) {
         基于JDK Proxy类中 的 newProxyInstance 方法，创建代理对象
         */
        return (UserService) Proxy.newProxyInstance(
                ProxyUtils.class.getClassLoader(),//类加载器
                new Class[]{UserService.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                       //什么样的需要增强呢？
                        String methodName = method.getName();
                       if(methodName.equals("login")|| methodName.equals("deleteUsers")|| methodName.equals("selectUsers")){
                           //方法执行之前计算时间
                           long startTime = System.currentTimeMillis();
                           //执行原始的方法
                           Object result = method.invoke(userService, args);//调用原始的方法 接收返回值
                           //方法执行之后计算时间
                           long endTime = System.currentTimeMillis();
                           System.out.println(methodName+"方法耗时：" + (endTime - startTime) + "毫秒");
                           return result;
                       }

                        //其他不需要计算时间的方法
                        return method.invoke(userService, args);
                    }
                });
    }

}
